home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / sun3.md / machAsmDefs.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  8KB  |  275 lines

  1. /*
  2.  * machAsmDefs.h --
  3.  *
  4.  *    Macros used when writing assembler programs.
  5.  *
  6.  * Copyright (C) 1985 Regents of the University of California
  7.  * All rights reserved.
  8.  *
  9.  *
  10.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/mach/sun3.md/machAsmDefs.h,v 9.0 89/09/12 14:51:27 douglis Stable $ SPRITE (Berkeley)
  11.  */
  12.  
  13. #ifndef _MACHASMDEFS
  14. #define _MACHASMDEFS
  15.  
  16. #include "machConst.h"
  17.  
  18. /*
  19.  * ----------------------------------------------------------------------------
  20.  *
  21.  * ENTRY --
  22.  *
  23.  *      Define an entry point for an assembler function.  This should be
  24.  *      the first line in any assembler function.  It provides the same
  25.  *      prolog that all C functions use.  name is the name of the
  26.  *      function,  numRegsToSave is the number of general purpose
  27.  *      registers (d0-d7, a0-a7) to save and regSaveMask is the mask which is
  28.  *      provided to the moveml instruction to save registers on the
  29.  *      stack.  See the 68000 manual for a description of how to formulate
  30.  *      the mask.
  31.  *
  32.  * ----------------------------------------------------------------------------
  33.  */
  34.  
  35. #define ENTRY(name, numRegsToSave, regSaveMask) \
  36.     .text ; .globl _/**/name ; _/**/name: ; \
  37.     NUMREGS  = numRegsToSave ;\
  38.     SAVEMASK = regSaveMask ;\
  39.     link a6,#-(NUMREGS*4); moveml #SAVEMASK, sp@;
  40.  
  41. /*
  42.  * ----------------------------------------------------------------------------
  43.  *
  44.  * RETURN --
  45.  *
  46.  *      Return from an assembly language function.  To be used in conjunction
  47.  *    with ENTRY.  This should be the last statement to appear in any 
  48.  *    assembly language function.
  49.  *
  50.  * ----------------------------------------------------------------------------
  51.  */
  52.  
  53. #define RETURN \
  54.     moveml  a6@(-(NUMREGS*4)),#SAVEMASK ; unlk a6 ; rts ;
  55.  
  56. /*
  57.  * ----------------------------------------------------------------------------
  58.  *
  59.  * Call Interrupt Handler --
  60.  *
  61.  *      Call an interrupt handler.  The temporary registers d0, d1, a0 and a1
  62.  *    are saved first, then interrupts are disabled and an "At Interrupt 
  63.  *    Level" flag is set so the handler can determine that it is running a
  64.  *    interrupt level.  The registers are restored at the end.
  65.  *    This code assumes that if the interrupt occured in user mode, and if
  66.  *    the specialHandling flag is set on the way back to user mode, then
  67.  *    a context switch is desired. Note that schedFlags is not checked.
  68.  *
  69.  *  Algorithm:
  70.  *    Save temporary registers
  71.  *    Determine if interrupt occured while in kernel mode or user mode
  72.  *    Call routine
  73.  *    if interrupt occured while in user mode.
  74.  *        if specialHandling is set for the current process 
  75.  *                Set the old status register trace mode bit on.
  76.  *            Clear the specialHandling flag.
  77.  *        endif
  78.  *    endif
  79.  *    restore registers
  80.  *        
  81.  *
  82.  * ----------------------------------------------------------------------------
  83.  */
  84.  
  85. #define    INTR_SR_OFFSET    16
  86.  
  87. #define CallInterruptHandler(routine) \
  88.     moveml    #0xC0C0, sp@-; \
  89.     movw    #MACH_SR_HIGHPRIO, sr ; \
  90.     movw    sp@(INTR_SR_OFFSET), d0; \
  91.     andl    #MACH_SR_SUPSTATE, d0; \
  92.     movl    d0, _mach_KernelMode; \
  93.     movl    #1, _mach_AtInterruptLevel ; \
  94.     \
  95.     jsr    routine; \
  96.     \
  97.     clrl    _mach_AtInterruptLevel ; \
  98.     tstl    _mach_KernelMode; \
  99.     bne    1f; \
  100.     \
  101.     movl    _proc_RunningProcesses, a0; \
  102.     movl    a0@, a1; \
  103.     movl    _machSpecialHandlingOffset, d1;\
  104.     tstl    a1@(0,d1:l); \
  105.     beq    1f; \
  106.     \
  107.     clrl    a1@(0,d1:l); \
  108.     movw    sp@(INTR_SR_OFFSET), d0; \
  109.     orw    #MACH_SR_TRACEMODE, d0; \
  110.     movw    d0, sp@(INTR_SR_OFFSET); \
  111.     \
  112. 1:    moveml    sp@+, #0x0303; \
  113.         rte ;
  114.  
  115.  
  116. #ifdef sun3
  117. #define BUS_ERROR_MOVS movsb
  118. #else 
  119. #define BUS_ERROR_MOVS movsw
  120. #endif
  121.  
  122. /*
  123.  * ----------------------------------------------------------------------------
  124.  *
  125.  * RestoreUserFpuState --
  126.  *
  127.  *      Restore the floating point registers from the process state.
  128.  *
  129.  * ----------------------------------------------------------------------------
  130.  */
  131. #ifdef sun3
  132. #define RestoreUserFpuState() \
  133.         tstl        _mach68881Present; \
  134.     beq         2f; \
  135.     movl        _machCurStatePtr, a0; \
  136.     tstb        a0@(MACH_TRAP_FP_STATE_OFFSET); \
  137.     beq         1f; \
  138.     fmovem      a0@(MACH_TRAP_FP_CTRL_REGS_OFFSET), fpc/fps/fpi; \
  139.     fmovem      a0@(MACH_TRAP_FP_REGS_OFFSET), #0xff; \
  140. 1: \
  141.     frestore    a0@(MACH_TRAP_FP_STATE_OFFSET); \
  142. 2:
  143. #else
  144. #define RestoreUserFpuState()
  145. #endif
  146.  
  147. /*
  148.  * ----------------------------------------------------------------------------
  149.  *
  150.  * RestoreUserRegs --
  151.  *
  152.  *      Restore the user stack pointer and the general purpose registers from
  153.  *    the process state.
  154.  *
  155.  * ----------------------------------------------------------------------------
  156.  */
  157. #define RestoreUserRegs() \
  158.     movl    _machCurStatePtr, a0; \
  159.     movl    a0@(MACH_USER_SP_OFFSET), a1; \
  160.     movc    a1, usp; \
  161.     moveml    a0@(MACH_TRAP_REGS_OFFSET), #0xffff
  162.  
  163. /*
  164.  * ----------------------------------------------------------------------------
  165.  *
  166.  * SaveUserFpuState --
  167.  *
  168.  *      Restore the floating point registers from the process state.
  169.  *      The address of machCurStatePtr must already be in register a0.
  170.  *
  171.  * ----------------------------------------------------------------------------
  172.  */
  173. #ifdef sun3
  174. #define SaveUserFpuState() \
  175.         tstl        _mach68881Present; \
  176.     beq         1f; \
  177.     fsave       a0@(MACH_TRAP_FP_STATE_OFFSET); \
  178.     tstb        a0@(MACH_TRAP_FP_STATE_OFFSET); \
  179.     beq         1f; \
  180.     fmovem      fpc/fps/fpi, a0@(MACH_TRAP_FP_CTRL_REGS_OFFSET); \
  181.     fmovem      #0xff, a0@(MACH_TRAP_FP_REGS_OFFSET); \
  182.     frestore    _mach68881NullState; \
  183. 1:
  184. #else
  185. #define SaveUserFpuState()
  186. #endif
  187.  
  188. /*
  189.  * ----------------------------------------------------------------------------
  190.  *
  191.  * SaveUserRegs --
  192.  *
  193.  *      Restore the user stack pointer and the general purpose registers from
  194.  *    the process state.
  195.  *
  196.  * ----------------------------------------------------------------------------
  197.  */
  198. #define SaveUserRegs() \
  199.     movl    _machCurStatePtr, a0; \
  200.     movc    usp, a1; \
  201.     movl    a1, a0@(MACH_USER_SP_OFFSET); \
  202.     moveml    #0xffff, a0@(MACH_TRAP_REGS_OFFSET);
  203.  
  204.  
  205. /*
  206.  *----------------------------------------------------------------------
  207.  *
  208.  * Call Trap Handler --
  209.  *
  210.  * Go through the following steps:
  211.  * 
  212.  *   1) Determine if are in kernel or user mode.  If kernel mode then just
  213.  *    put d0, d1, a0, a1, bus error reg and trap type onto stack and
  214.  *    call trap handler.
  215.  *
  216.  *   Otherwise:
  217.  *
  218.  *   1) Grab a pointer to the current processes state structure.
  219.  *    If the state structure does not exist then call the debugger directly.
  220.  *      Since it requires a temporary register to get a pointer to the
  221.  *    state structure a0 is saved on the stack.
  222.  *   2) Save the normal registers (a0-a7,d0-d6) into the state struct.
  223.  *   3) Copy the saved value of a0 from the stack into the state struct.
  224.  *   4) Copy the true value of the stack pointer into the state struct.
  225.  *   5) Make room on the stack for the registers that would have been saved
  226.  *    (a0, a1, d0, and d1) if we had been in kernel mode.
  227.  *   6) Save the bus error register on the stack.
  228.  *   7) Push the trap type on the stack.
  229.  *   8) Call the trap handler.
  230.  *
  231.  *----------------------------------------------------------------------
  232.  */
  233.  
  234. #define CallTrapHandler(type) \
  235.     .globl    _proc_RunningProcesses, _machStatePtrOffset; \
  236.     movl    d0, sp@-; \
  237.     movw    sp@(4), d0; \
  238.     andl    #MACH_SR_SUPSTATE, d0; \
  239.     beq    9f; \
  240.     movl    sp@+, d0; \
  241.     moveml    #0xC0C0, sp@-; \
  242.     BUS_ERROR_MOVS VMMACH_BUS_ERROR_REG, d0; \
  243.         movl    d0, sp@-; \
  244.     movl    #type, sp@-; \
  245.         jsr     _MachTrap; \
  246.     jra    MachReturnFromKernTrap; \
  247.     \
  248. 9:      movl    sp@+, d0; \
  249.     cmpl    #0xffffffff, _machCurStatePtr; \
  250.     bne    8f; \
  251.     \
  252.     subl    #16, sp; \
  253.     BUS_ERROR_MOVS VMMACH_BUS_ERROR_REG,d0; \
  254.         movl    d0, sp@-; \
  255.     movl    #type, sp@-; \
  256.     jra    _Dbg_Trap; \
  257.     \
  258. 8:    movl    a0, sp@-; \
  259.     movl    _machCurStatePtr, a0; \
  260.     moveml    #0x7fff, a0@(MACH_TRAP_REGS_OFFSET); \
  261.     SaveUserFpuState(); \
  262.     movl    sp@+, a0@(MACH_TRAP_REGS_OFFSET + 32); \
  263.     movl    sp, a0@(MACH_TRAP_REGS_OFFSET + 60); \
  264.     movc    usp, a1; \
  265.     movl    a1, a0@(MACH_USER_SP_OFFSET); \
  266.     movl    sp, a0@(MACH_EXC_STACK_PTR_OFFSET); \
  267.     subl    #16, sp; \
  268.     BUS_ERROR_MOVS VMMACH_BUS_ERROR_REG,d0; \
  269.         movl    d0, sp@-; \
  270.     movl    #type, sp@-; \
  271.         jsr     _MachTrap; \
  272.     jra    MachReturnFromUserTrap;
  273.  
  274. #endif /* _MACHASMDEFS */
  275.